package wq.gdky005.main;

import java.util.Random;

import org.apache.http.protocol.HTTP;

import wq.gdky005.R;
import wq.gdky005.app.MainApplication;
import wq.gdky005.util.TestUtils;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
 * WebView是一个专门用来显示网页的View子类。它使用WebKit渲染引擎来显示网页， 并且支持包括前进，后退，放大，缩小，文本搜索等多种功能。
 * 
 * @author wangqing 2013-7-26
 */
public class WebViewActivity extends BaseActivity {

	private WebView webView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.webview_layout);

		webView = (WebView) findViewById(R.id.webView);
		initWebView(webView);

		Random random = new Random();
		switch (random.nextInt(3)) {
		case 0:
			loadUrl(webView);
			break;
		case 1:
			loadData(webView);
			break;
		case 2:
			loadDataWithBaseUrl(webView);
			break;
		}
	}

	/**
	 * 加载本地的URL 直接加载网页、图片并显示.（本地或是网络上的网页、图片、gif） 
	 * 
	 * 注： 1、后面四句包含“loadUrl”的语句分别对应加载 在线网页/在线图片/本地网页/本地图片四中情况，每种情况下只取其一。
	 * 2、对于sdcard中的本地网页和图片等资源， 一般url地址以 “file:///mnt/sdcard/”开头；
	 * 3、对于android项目中assets目录下的 本地网页和图片等资源， 一般url地址以 “ file:///android_asset/
	 * "开头；
	 * 
	 * wangqing 2013-7-26 void
	 */
	private void loadUrl(WebView wv) {
		// 加载在线网页
		wv.loadUrl("http://www.baidu.com");
		// 加载在线图片
		wv.loadUrl("http://himg.bdimg.com/sys/portrait/item/fda167646b793030353803.jpg?cdnversion=1818");
		// 加载本地网页(SD卡根目录下)
		wv.loadUrl("file:///mnt/sdcard/wangqing.html");
		// 加载本地图片(SD卡根目录下)
		wv.loadUrl("file:///mnt/sdcard/wangqing.jpg");
	}

	/**
	 * 显示文字与图片内容 （模拟器1.5、1.6）  loadData将指定的data加载到WebView中。由于本身机制的原因，该方法 不能 加载来自
	 * 网络的内容 。
	 * 
	 * 参数data，内的html代码中若含有以下四种字符'#', '%', '\', '?'，则应该依次替换为%23, %25, %27, %3f 。
	 * # ——> %23 % ——> %25 \ ——> %27 ? ——> %3f
	 * 
	 * 参数mimeType，即MIME Type，也就是该资源的媒体类型，可以取值text/html, image/jpeg等。
	 * 
	 * 参数 encoding为网页编码，可以取值utf-8, base64等 wangqing
	 * 
	 * 
	 * 注： 1、中间两个data字段分别对应加载本地网页代码和本地图片的情况；
	 * 2、经过实际操作，发现前面文本超级链接的html代码可以正常显示。点击超级链接，调用外部web浏览器打开链接。
	 * 3、经过实际操作，发现后面的本地图片其实加载不上来，无法显示。 4、loadData方法中，如果data含有中文字符，则需要调用
	 * setDefaultTextEncodingName方法来设置WebView的text指定编码
	 * 。详情请点击阅读：《关于WebView的loadData方法》
	 * 
	 * 
	 * 
	 * 
	 * 2013-7-26 void
	 * 
	 * @param webView
	 */
	private void loadData(WebView webView) {

		final String mimeType = "text/html"; // image/jpeg etc
		final String encoding = "utf-8"; // base64 etc
		String data = null;

		// 加载本地网页Html代码
		data = "<a href ='http://www.baidu.com/'>百度</a>";
		// 加载本地图片(SD卡根目录下)
		data = "loadData方法加载本地图片<img src ='file:///mnt/sdcard/wangqing.jpg' />";
		// 对于data中含有中文字符的，必须加上这个设置，否则会乱码。
		webView.getSettings().setDefaultTextEncodingName(encoding);
		webView.loadData(data, mimeType, encoding);
	}

	/**
	 * 显示文字与图片内容 （模拟器1.5、1.6） 
	 * 
	 * loadDataWithBaseURL方法也是将指定的data加载到WebView中。由于本身机制的原因，
	 * 该方法不能加载来自网络的内容。参数mimeType，即MIME Type， 也就是该资源的媒体类型，可以取值text/html,
	 * image/jpeg等。参数 encoding为网页编码， 可以取值utf-8, base64等。
	 * 
	 * 
	 * 参数baseUrl为基础目录， data中的文件路径可以是相对于基础目录的相对目录
	 * 例如：文件http://www.baidu.com/uploadfile/2011/0930/20110930021037759.jpg，
	 * baseUrl为file:///mnt/sdcard/ 那么data中就可以直接引用图片 wangqing.jpg了。
	 * 
	 * 参数historyUrl用作历史记录的字段，可以设置为null。
	 * 
	 * 注： 中间两个data字段分别对应加载本地网页和本地图片的情况。经过测试，网页和本地图片都能正常加载。
	 * 
	 * wangqing 2013-7-26 void
	 * 
	 * @param webView
	 */
	private void loadDataWithBaseUrl(WebView webView) {
		// 网页基础目录
		String baseUrl = "file:///mnt/sdcard/";
		// 加载本地网页Html代码(SD卡根目录下)
		String data = "<a href='Google.html'>谷歌</a>";
		// ：加载本地图片(SD卡根目录下)
		String dataImage = "<img src ='wangqing.jpg' />";
		webView.loadDataWithBaseURL(baseUrl, data, "text/html", "utf-8", null);
	}

	/**
	 * WebView有一个辅助类叫WebSettings，它管理WebView的设置状态。
	 * 该类的对象可以通过WebView.getSettings()方法获得
	 * 
	 * wangqing 2013-7-26 void
	 */
	private void initWebView(WebView webView) {
		WebSettings webSettings = webView.getSettings();
		// 设置支持 JavaScript 的参数
		webSettings.setJavaScriptEnabled(true);
		// 设置可以支持缩放
		webSettings.setSupportZoom(true);
		// 设置出现缩放工具
		webSettings.setBuiltInZoomControls(true);
		// 设置默认缩放方式尺寸是far
		setDefualtZoom(webSettings);
		// 设置允许访问文件数据
		webSettings.setAllowFileAccess(true);
		// 设置是否保存密码
		webSettings.setSavePassword(true);
		// 设置网页默认编码
		webSettings.setDefaultTextEncodingName(HTTP.UTF_8);
		// 设置网页支持 Flash
		webSettings.setPluginsEnabled(true);
		// 设置网页 可以通过 JS 打开新的窗口
		webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
		// 设置任意缩放比例 大视图模式，将图片调整到适合webview的大小
		webSettings.setUseWideViewPort(true);
		setLayoutAlgorithm(webSettings);

		/**
		 * 设置充满WebView
		 * 
		 * 使用webview显示网页或者图片、flash的时候，总会出现没有充满webview的现象，左右滑动，
		 * 经过研究设置属性mWebView.getSettings().setLoadWithOverviewMode(true);
		 * 就可以使之充满全屏。
		 */
		webSettings.setLoadWithOverviewMode(true);

		setWebViewClient(webView);
	}

	private void setLayoutAlgorithm(WebSettings webSettings) {
		Random random = new Random();
		switch (random.nextInt(3)) {
		case 0:
			webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
			break;
		case 1:
			webSettings.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
			break;
		case 2:
			webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
			break;
		default:
			webSettings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
			break;
		}
		
	}

	/**
	 * 点击链接继续在当前browser中响应
	 * 
	 * wangqing 2013-7-26 void
	 * 
	 * @param webView
	 */
	private void setWebViewClient(WebView webView) {
		webView.setWebViewClient(new WebViewClient() {
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				view.loadUrl(url);
				return true;
				// return super.shouldOverrideUrlLoading(view, url);
			}
		});
	}

	/**
	 * 设置默认缩放方式 wangqing 2013-7-26 void
	 * 
	 * @param webSettings
	 */
	private void setDefualtZoom(WebSettings webSettings) {
		TestUtils.logI("手机屏幕的密度是： " + MainApplication.screenDensity);
		switch (MainApplication.screenDensity) {

		case DisplayMetrics.DENSITY_LOW:
			webSettings.setDefaultZoom(WebSettings.ZoomDensity.CLOSE);
			break;
		case DisplayMetrics.DENSITY_MEDIUM:
			webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
			break;
		case DisplayMetrics.DENSITY_HIGH:
			webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);
			break;
		default:
			webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);
			break;
		}
	}

	/**
	 * 浏览的网 页回退而不是退出浏览器
	 * 
	 * wangqing 2013-7-26 void
	 */
	@Override
	public void onBackPressed() {
		if (webView.canGoBack()) {
			webView.goBack();
			return;
		}
		super.onBackPressed();
	}
}
